package com.example.quiz.controler;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Random;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.util.Base64;
import android.util.Log;

import com.example.quiz.Inicial;
import com.example.quiz.model.HttpManager;
import com.example.quiz.model.PacoteRequisicao;
import com.example.quiz.model.Pergunta;

public class Jogo{

	private ArrayList<Pergunta> perguntas = new ArrayList<Pergunta>();
	private boolean rodando;
	private int rodadas;
	private int controleRodadas = 0;
	private ArrayList<Integer> sequenciaQuiz ;
	private ArrayList<Integer> sequenciaAlternativas ;
	private Random random = new Random();
	private KitQuiz kitQuiz;
	private int quantidadeDeQuiz = 5;
	
	private Tarefa tarefa;
	private HttpManager hm = new HttpManager();
	private String persistencia = null;
	
	private JSONArray jsonArray;
	
	public Jogo(){
		
		this.kitQuiz = new KitQuiz();
		
		tarefa = new Tarefa();
		PacoteRequisicao pacote = new PacoteRequisicao();
		pacote.setMethod("POST");
		pacote.setUri("http://192.168.25.18:8080/QuizServer/ServletPerguntas");
		pacote.setParametro("usuario", Inicial.USUARIO);	
		
		tarefa.execute(pacote);	
		
	}
	
	public void inicializar(){	
		Log.i("estado","inicializando");
		setarRodadas();		
		construirSequenciaDeQuiz();
		construirQuiz();
		rodando = true;
	}
	private class Tarefa extends AsyncTask<PacoteRequisicao, String, String>{

		@Override
		protected void onPreExecute() {
		}
		
		@Override
		protected String doInBackground(PacoteRequisicao... params) {
			
			try {
				jsonArray = new JSONArray(hm.getData(params[0]));	
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				
				e.printStackTrace();
				
			}			
			return null;
		}
		
		@Override
		protected void onPostExecute(String result) {	
			int indice = 0;
			try {
				for (int i = 0; i < jsonArray.length(); i++) {
					
					JSONObject obj = jsonArray.getJSONObject(i);
					Pergunta pergunta = new Pergunta();		
					pergunta.setPergunta(obj.getString("pergunta"));
					pergunta.setResposta(obj.getString("resposta"));
					pergunta.setAlternativas(obj.getString("alternativas"));
					pergunta.setId(obj.getInt("id"));
					
					try {
						String imageEncode = obj.getString("foto");
						byte[] img = null;
						img = Base64.decode(imageEncode, 0);
						pergunta.setFoto(img);
					} catch (Exception e) {
						Log.i("ex","decodificação ");
						e.printStackTrace();
					}
							
					perguntas.add(pergunta);
					indice++;
				}
			} catch (JSONException e) {
				
				e.printStackTrace();
			}	

			inicializar();	
		}
		
		@Override
		protected void onProgressUpdate(String... values) {
		}
	}

	
	
	
	private void construirQuiz() {
		long id = 1;
		for (Integer in : sequenciaQuiz) {
			Quiz q = new Quiz(id);
			q.setFoto(perguntas.get(in).arrayToBitmap(perguntas.get(in).getFoto()));
			q.setPergunta(perguntas.get(in).getPergunta());	
			String[] alternativas = perguntas.get(in).getAlternativasArray();
			String alternativasTemp = "";
			construirSequenciaDeAlternativas(alternativas.length);
			for (Integer ins : sequenciaAlternativas) {
				alternativasTemp = alternativasTemp+"|"+alternativas[ins];
			}
			
			alternativasTemp = alternativasTemp.substring(1);
			String[] alts = alternativasTemp.split("\\|");
			q.setAlternativas(alts);
			
			q.setResposta(perguntas.get(in).getResposta());			

			
			kitQuiz.addQuiz(q);
			
			id++;
		}
	}

	private void construirSequenciaDeAlternativas(int max){
		LinkedHashSet<Integer> seqw =new LinkedHashSet<Integer>();
		seqw.add(aleatorioSequenciaAlternativas(max));	
		while(seqw.size() < max){
			seqw.add(aleatorioSequenciaAlternativas(max));
		}
		sequenciaAlternativas = new ArrayList<Integer>(seqw);
	}
	
	
	
	public KitQuiz getKitQuiz() {
		return kitQuiz;
	}

	private void construirSequenciaDeQuiz() {
		LinkedHashSet<Integer> seq =new LinkedHashSet<Integer>();		
		seq.add(aleatorioSequencia());		
		while(seq.size() < rodadas){
			seq.add(aleatorioSequencia());
		}
		sequenciaQuiz = new ArrayList<Integer>(seq);
	}
	private int aleatorioSequenciaAlternativas(int max){
		int i = max * 1000;
		i = random.nextInt(i);
		return i/1000;
	}
	private int aleatorioSequencia(){
		int i = perguntas.size()*1000;
		i = random.nextInt(i);
		
		return i/1000;
	}
	
	public int getRodadas(){
		return rodadas;
	}
	public int aleatorioResposta(Pergunta pergunta){		
		return random.nextInt(pergunta.getAlternativasArray().length);
	}
	private void setarRodadas(){
		if(perguntas.size()<10){
			rodadas = perguntas.size();
		}else{
			rodadas = quantidadeDeQuiz;
		}
	}

	public boolean isRodando() {
		return rodando;
	}

	public int getControleRodadas() {
		return controleRodadas;
	}
	
}
